package es.ucm.is.www.GUI.client.movements;

import java.util.ArrayList;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.WindowResizeListener;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FocusPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.MouseListener;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

import es.ucm.is.www.GUI.client.Panel1;
import es.ucm.is.www.GUI.client.Root;
import es.ucm.is.www.GUI.client.map.Mapa;
import es.ucm.is.www.GUI.client.panels.ErrorPanel;
import es.ucm.is.www.GUI.client.panels.PanelAlert;
import es.ucm.is.www.GUI.client.panels.PanelWaitingRight;

/**
 * <p>Title: ListaRutas.java </p>
 *
 * <p>Description: Clase que genera la lista de rutas</p>
 *
 * <p>Copyright: </p>
 *
 * @author 
 * @version 1.0
 * @see
 */
public class ListaRutas extends Composite{
	
	private Grid g;
	private PopupPanel padre;
	//private Mapa map;
	private AbsolutePanel panel;
	private WindowResizeListener listener;
	/**
	 * Constructora de la clase
	 * @param padre: panel que solicita generar la lista de rutas
	 */
	public ListaRutas(PopupPanel padre){
		this.padre = padre;
		final PanelWaitingRight wait = new PanelWaitingRight("Cargando rutas");
		wait.mostrar();
		MovementsServiceAsync servicio = (MovementsServiceAsync) GWT.create(MovementsService.class);
		ServiceDefTarget endpoint = (ServiceDefTarget) servicio;
		endpoint.setServiceEntryPoint(GWT.getModuleBaseURL() + "servletMovements");
		
		AsyncCallback<ArrayList<MovementGUI>> callback = new AsyncCallback<ArrayList<MovementGUI>>(){

			public void onFailure(Throwable caught) {
				wait.ocultar();
				ErrorPanel error= new ErrorPanel("Error cargando las rutas...");
				error.show();
			}

			public void onSuccess(ArrayList<MovementGUI> result) {
				if(result==null){
					wait.ocultar();
					ErrorPanel error= new ErrorPanel("Error cargando las rutas...");
					error.show();
				}else if (result.size()==0){
					wait.ocultar();
					PanelAlert.Alert("Informaci&oacute;n", "No tienes rutas activas");
				}else{
					cargarRutas(result,wait);
				}
			}
			
		};
		ArrayList<String> nombres = new ArrayList<String>();
		for(int i = 0; i < Mapa.getInstance().getCiudadesMapa().size(); i++) {
			nombres.add(Mapa.getInstance().getCiudadesMapa().get(i).getCityName());
		}
		servicio.getRoutes(Panel1._tuplaLogin.get_user(),nombres, callback);
	}
	/**
	 * Metodo que carga las rutas
	 * @param rutas ArrayList que va almacenando las rutas generadas
	 * @param wait panel de espera
	 */
	private void cargarRutas(final ArrayList<MovementGUI> rutas,PanelWaitingRight wait){
		g = new Grid(rutas.size()+1,2);
		HTML nombre1;
		HTML nombre2;
		nombre1 = new HTML("<b>Origen</b>");
		nombre1.setStyleName("titulos");
		nombre2 = new HTML("<b>Destino</b>");
		nombre2.setStyleName("titulos");
		g.setWidget(0, 0, nombre1);
		g.setWidget(0, 1, nombre2);
		
		FocusPanel f1;
		FocusPanel f2;
		ArrayList<FocusPanel> panels = new ArrayList<FocusPanel>();
		for(int i = 0; i < rutas.size();i++) {
			nombre1 =  new HTML(rutas.get(i).getOrigin().getCityName());
			
			f1 = new FocusPanel(nombre1);
			panels.add(f1);
			final int aux = i+1;
			f1.addMouseListener(new MouseListener(){
				
				int fila = aux;
				public void onMouseDown(Widget sender, int x, int y) {
					RootPanel.get().remove(panel);
					padre.hide();
					Window.removeWindowResizeListener(listener);
					Mapa.getInstance().pintarRuta(rutas.get(fila-1));
				}

				public void onMouseEnter(Widget sender) {
					g.getRowFormatter().addStyleName(fila, "listaRutasSelec");
					g.getRowFormatter().addStyleName(fila, "cursorHand");
				}

				public void onMouseLeave(Widget sender) {
					g.getRowFormatter().removeStyleName(fila, "listaRutasSelec");
					g.getRowFormatter().removeStyleName(fila, "cursorHand");
					
				}

				public void onMouseMove(Widget sender, int x, int y) {
					
					
				}

				public void onMouseUp(Widget sender, int x, int y) {
					
					
				}
				
			});
			nombre2 =  new HTML(rutas.get(i).getDestination().getCityName());
			f2 = new FocusPanel(nombre2);
			panels.add(f2);
			f2.addMouseListener(new MouseListener(){
			
				int fila = aux;
				public void onMouseDown(Widget sender, int x, int y) {
					RootPanel.get().remove(panel);
					padre.hide();
					Window.removeWindowResizeListener(listener);
					Mapa.getInstance().pintarRuta(rutas.get(fila-1));
				
				}

				public void onMouseEnter(Widget sender) {
					
					g.getRowFormatter().addStyleName(fila, "listaRutasSelec");
					g.getRowFormatter().addStyleName(fila, "cursorHand");
				}

				public void onMouseLeave(Widget sender) {
					g.getRowFormatter().removeStyleName(fila, "listaRutasSelec");
					g.getRowFormatter().removeStyleName(fila, "cursorHand");
					
				}

				public void onMouseMove(Widget sender, int x, int y) {
					
					
				}

				public void onMouseUp(Widget sender, int x, int y) {
					
					
				}
				
			});
			
			g.setWidget(i+1, 0, f1);
			g.setWidget(i+1, 1, f2);
		}
		
		//g.setBorderWidth(0);
		g.setCellSpacing(0);
		wait.ocultar();
		
		int max = Integer.MIN_VALUE;
		/*for(int i = 0; i < panels.size(); i++){*/
			/*if(i%2 == 0){
				panels.get(i).addStyleName("listaRutasPrimero");
			}else{
				panels.get(i).addStyleName("listaRutasUltimo");
			}*//*
			if(max<panels.get(i).getOffsetWidth()){
				max = panels.get(i).getOffsetWidth();
			}
		}*/
		g.getRowFormatter().setStyleName(0, "listaRutasPrimero");
		for(int i = 1;i < g.getRowCount();i++){
			for(int j = 0; j < g.getColumnCount();j++){
				g.getCellFormatter().setStyleName(i,j, "filaListaRutas");
				if(i == g.getRowCount()-1){
					g.getCellFormatter().addStyleName(i,j, "filaListaRutasUltimo");
				}
			}
			
		}
		//panels.get(0).addStyleName("primeraFila");
		//panels.get(1).addStyleName("primeraFila");
		/*int aux;
		for(int i = 0; i < panels.size(); i++) {
			panels.get(i).setHeight(max  + "px");
			aux = panels.get(i).getOffsetHeight()+5;
			panels.get(i).setHeight(aux + "px");
		}*/
		panel = new AbsolutePanel();
		panel.setPixelSize(RootPanel.get().getOffsetWidth(), RootPanel.get().getOffsetHeight());
		panel.setStyleName("glass");
		panel.getElement().setId("fondo");
		Root.fondo = panel;
		RootPanel.get().add(panel,0,0);
		Button cerrar = new Button("Cerrar");
		cerrar.addClickListener(new ClickListener(){

			public void onClick(Widget sender) {
				RootPanel.get().remove(panel);
				padre.hide();
				Window.removeWindowResizeListener(listener);
			}
			
		});
		VerticalPanel vPanel = new VerticalPanel();
		vPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		vPanel.add(g);
		vPanel.add(cerrar);
		initWidget(vPanel);
		padre.setWidget(this);
		listener = new WindowResizeListener(){

			public void onWindowResized(int width, int height) {
				padre.setPopupPosition(RootPanel.get().getOffsetWidth()/2, RootPanel.get().getOffsetHeight()/2);
			}
			
		};
		Window.addWindowResizeListener(listener);
		padre.center();
	}

}
